///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: signal.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 系统日志
//* QQ:	2085827949
//**********************************************************************/

#include <unistd.h>
#include "stdio.h"
#include "stdlib.h"
#include "lap_lib.h"
#include "laperro.h"


#if 0

/*
* 作为针对stdo缓冲区问题的特定解决方案，可以在调用 forko之前使用函数 fflush
来刷新sdio缓冲区。作为另一种选择，也可以使用 setvbu0和 seibu0来关闭 stdio流
的缓冲功能。

* 子进程可以调用 exito而非exi0，以便不再刷新 stdio缓冲区。这一技术例证了一个
更为通用的原则：在创建子进程的应用中，典型情况下仅有一个进程（一般为父进程）
应通过调用exit0终止，而其他进程应调用cxit0终止，从而确保只有一个进程调用退
出处理程序并刷新 stdio缓冲区，这也算是众望所归吧。
*/

// 错误
static void Lap_fork_stdio()
{
  printf("respate\n");
  write(STDOUT_FILENO,"lap\n",4);
  if(fork() == 0) exit(0); 
  sleep(1);
  exit(0);
}


// 解决方式一 
// fork会复制stdio缓冲区，应统一使用stdio函数,在调用fork之前，使用fflush刷新stdio缓冲区
// fork不会复制内核缓冲区，故统一使用系统调用(read,writ) 不会出现错误
static void Lap_solve1()
{
  printf("respate\n");
  fflush(stdout);
  write(STDOUT_FILENO,"lap\n",4);
  

  if(fork() == 0) exit(0); 
  sleep(1);
  exit(0);
}


// 解决方式二 
// 调用 _eixt函数退出(_exit不会刷新stdio缓冲区，而exit会刷新stdio缓冲区)
static void Lap_solve2()
{
  printf("respate\n");
  write(STDOUT_FILENO,"lap\n",4);
  
  if(fork() == 0) _exit(0); 
  sleep(1);
  exit(0);
}


int main(void)
{
  LAP_ErrOutSet(NULL);  // 初始化 错误信息

   Lap_fork_stdio();
  // Lap_solve1();
  Lap_solve2();
}
#endif